﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем НарастающийНомерИзображения;

&НаКлиенте
Перем ПозицияДляВставки;

&НаКлиенте
Перем ПодключаемыйМодуль;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	Элементы.ТаблицаФайлов.Видимость = Ложь;
	Элементы.ФормаПринятьВсеКакОдинФайл.Видимость = Ложь;
	Элементы.ФормаПринятьВсеКакОтдельныеФайлы.Видимость = Ложь;
	
	Если Параметры.Свойство("ТипРезультата") Тогда
		ТипРезультата = Параметры.ТипРезультата;
	КонецЕсли;
	
	Если Параметры.Свойство("ВладелецФайла") Тогда
		ВладелецФайла = Параметры.ВладелецФайла;
	КонецЕсли;
	
	ТолькоОдинФайл = Параметры.ТолькоОдинФайл;
	
	Если Параметры.Свойство("ЭтоФайл") Тогда
		ЭтоФайл = Параметры.ЭтоФайл;
	КонецЕсли;
	
	ИдентификаторКлиента = Параметры.ИдентификаторКлиента;
	
	Если Параметры.Свойство("НеОткрыватьКарточкуПослеСозданияИзФайла") Тогда
		НеОткрыватьКарточкуПослеСозданияИзФайла = Параметры.НеОткрыватьКарточкуПослеСозданияИзФайла;
	КонецЕсли;
	
	НомерФайла = РаботаСФайламиСлужебный.ПолучитьНовыйНомерДляСканирования(ВладелецФайла);
	ИмяФайла = РаботаСФайламиСлужебныйКлиентСервер.ИмяСканированногоФайла(НомерФайла, "");

	ПрочитатьНастройки();
	
	Элементы.ФормаНастройка.Видимость = Не ПоказыватьДиалогСканера;
	
	Если Параметры.Свойство("ПараметрыСканирования") Тогда
		ЗаполнитьЗначенияСвойств(ЭтотОбъект, Параметры.ПараметрыСканирования);
	КонецЕсли;
	
	Если СохранятьВPDF Тогда
		ФорматКартинки = "PDF";
	Иначе	
		ФорматКартинки = Строка(ФорматСканированногоИзображения);
	КонецЕсли;
	
	ФорматJPG = Перечисления.ФорматыСканированногоИзображения.JPG;
	ФорматTIF = Перечисления.ФорматыСканированногоИзображения.TIF;
	
	ПреобразоватьПеречисленияВПараметрыИПолучитьПредставление();
	
	ПараметрыЗаданияСканирования = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("КомпонентаСканирования", "ПараметрыЗаданияСканирования", Неопределено);
	Элементы.ОшибкаСканирования.Видимость = ПараметрыЗаданияСканирования <> Неопределено;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	
	Если Не ЗначениеЗаполнено(ТипРезультата) Тогда
		ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииПрисоединенныйФайл();
	КонецЕсли;
	
	Если Не ПроверкиПриОткрытииВыполнены Тогда
		Отказ = Истина;
		СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Истина);
		ПодключитьОбработчикОжидания("ПередОткрытием", 0.1, Истина);
	КонецЕсли;
	
	ПозицияДляВставки = Неопределено;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	
	Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Обработка.Сканирование.Форма.НастройкаСканированияНаСеанс") Тогда
		
		Если ТипЗнч(ВыбранноеЗначение) <> Тип("Структура") Тогда
			Возврат;
		КонецЕсли;
		
		РазрешениеПеречисление   = ВыбранноеЗначение.Разрешение;
		ЦветностьПеречисление    = ВыбранноеЗначение.Цветность;
		ПоворотПеречисление      = ВыбранноеЗначение.Поворот;
		РазмерБумагиПеречисление = ВыбранноеЗначение.РазмерБумаги;
		ДвустороннееСканирование = ВыбранноеЗначение.ДвустороннееСканирование;
		
		ИспользоватьImageMagickДляПреобразованияВPDF = ВыбранноеЗначение.ИспользоватьImageMagickДляПреобразованияВPDF;
		
		ПоказыватьДиалогСканера         = ВыбранноеЗначение.ПоказыватьДиалогСканера;
		ФорматСканированногоИзображения = ВыбранноеЗначение.ФорматСканированногоИзображения;
		КачествоJPG                     = ВыбранноеЗначение.КачествоJPG;
		СжатиеTIFFПеречисление          = ВыбранноеЗначение.СжатиеTIFF;
		СохранятьВPDF                   = ВыбранноеЗначение.СохранятьВPDF;
		ФорматХраненияМногостраничный   = ВыбранноеЗначение.ФорматХраненияМногостраничный;
		
		ПреобразоватьПеречисленияВПараметрыИПолучитьПредставление();
	ИначеЕсли ВРег(ИсточникВыбора.ИмяФормы) = ВРег("Обработка.Сканирование.Форма.ОшибкаСканирования") Тогда
		Элементы.ОшибкаСканирования.Видимость = РаботаСФайламиСлужебныйКлиент.БылаОшибкаСканирования();
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
	
	УдалитьВременныеФайлы(ТаблицаФайлов);
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыТаблицаФайлов

&НаКлиенте
Процедура ТаблицаФайловПриАктивизацииСтроки(Элемент)
#Если НЕ ВебКлиент И НЕ МобильныйКлиент Тогда
	Если Элементы.ТаблицаФайлов.ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	НомерТекущейСтроки = Элементы.ТаблицаФайлов.ТекущаяСтрока;
	СтрокаТаблицы = Элементы.ТаблицаФайлов.ДанныеСтроки(НомерТекущейСтроки);
	
	Если ПутьКВыбранномуФайлу <> СтрокаТаблицы.ПутьКФайлу Тогда
		
		ПутьКВыбранномуФайлу = СтрокаТаблицы.ПутьКФайлу;
		
		Если ПустаяСтрока(СтрокаТаблицы.АдресКартинки) Тогда
			ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКВыбранномуФайлу);
			СтрокаТаблицы.АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
		КонецЕсли;
		
		АдресКартинки = СтрокаТаблицы.АдресКартинки;
		
	КонецЕсли;
	
#КонецЕсли
КонецПроцедуры

&НаКлиенте
Процедура ТаблицаФайловПередУдалением(Элемент, Отказ)
	
	Если ТаблицаФайлов.Количество() < 2 Тогда
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	
	НомерТекущейСтроки = Элементы.ТаблицаФайлов.ТекущаяСтрока;
	СтрокаТаблицы = Элементы.ТаблицаФайлов.ДанныеСтроки(НомерТекущейСтроки);
	УдалитьФайлы(СтрокаТаблицы.ПутьКФайлу);
	
	Если ТаблицаФайлов.Количество() = 2 Тогда
		Элементы.ТаблицаФайловКонтекстноеМенюУдалить.Доступность = Ложь;
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

// Кнопка "Пересканировать" замещает выделенную (или единственную, если она одна) картинку 
//  (или добавляет в конец новые картинки, если ничего не выделено) новым изображением (изображениями).
//
&НаКлиенте
Процедура Пересканировать(Команда)
	
	Если ТаблицаФайлов.Количество() = 1 Тогда
		УдалитьВременныеФайлы(ТаблицаФайлов);
		ПозицияДляВставки = 0;
	ИначеЕсли ТаблицаФайлов.Количество() > 1 Тогда
		
		НомерТекущейСтроки = Элементы.ТаблицаФайлов.ТекущаяСтрока;
		СтрокаТаблицы = Элементы.ТаблицаФайлов.ДанныеСтроки(НомерТекущейСтроки);
		ПозицияДляВставки = ТаблицаФайлов.Индекс(СтрокаТаблицы);
		УдалитьФайлы(СтрокаТаблицы.ПутьКФайлу);
		ТаблицаФайлов.Удалить(СтрокаТаблицы);
		
	КонецЕсли;
	
	Если АдресКартинки <> "" Тогда
		УдалитьИзВременногоХранилища(АдресКартинки);
	КонецЕсли;	
	АдресКартинки = "";
	ПутьКВыбранномуФайлу = "";
	
	Элементы.Сохранить.Доступность = Ложь;
	
	ОписаниеОповещения = Новый ОписаниеОповещения("НачатьСканированиеПослеПолученияКомпоненты", ЭтотОбъект);
	РаботаСФайламиСлужебныйКлиент.ПроинициализироватьКомпоненту(ОписаниеОповещения, Истина);
		
КонецПроцедуры

&НаКлиенте
Процедура Сохранить(Команда)
	
	ПараметрыВыполнения = Новый Структура;
	ПараметрыВыполнения.Вставить("МассивФайловКопия", Новый Массив);
	ПараметрыВыполнения.Вставить("ФайлРезультата", "");
	
	Для Каждого Строка Из ТаблицаФайлов Цикл
		ПараметрыВыполнения.МассивФайловКопия.Добавить(Новый Структура("ПутьКФайлу", Строка.ПутьКФайлу));
	КонецЦикла;
	
	// Здесь работаем с одним файлом.
	СтрокаТаблицы = ТаблицаФайлов.Получить(0);
	ПутьКФайлуЛокальный = СтрокаТаблицы.ПутьКФайлу;
	
	ТаблицаФайлов.Очистить(); // Чтобы не удалились файлы в ПриЗакрытии.
	
	РасширениеРезультата = Строка(ФорматСканированногоИзображения);
	РасширениеРезультата = НРег(РасширениеРезультата); 
	
	Контекст = Новый Структура;
	Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения);
	Контекст.Вставить("ПутьКФайлуЛокальный", ПутьКФайлуЛокальный);
	Контекст.Вставить("ДвоичныеДанныеРезультата", "");
	
	Если СохранятьВPDF Тогда
		
#Если НЕ ВебКлиент И НЕ МобильныйКлиент Тогда
		ПараметрыВыполнения.ФайлРезультата = ПолучитьИмяВременногоФайла("pdf"); // АПК:441 Удаление временного файла см. ПринятьЗавершение.
#КонецЕсли
		
		ПараметрыКонвертацииГрафическогоДокумента = РаботаСФайламиКлиент.ПараметрыКонвертацииГрафическогоДокумента();
		ПараметрыКонвертацииГрафическогоДокумента.ИмяФайлаРезультата = ПараметрыВыполнения.ФайлРезультата;
		Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииПрисоединенныйФайл() Тогда
			ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла();
		ИначеЕсли ЗначениеЗаполнено(ТипРезультата) Тогда
			ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = ТипРезультата;
		КонецЕсли;
		Оповещение = Новый ОписаниеОповещения("СохранитьПослеОбъединения", ЭтотОбъект, Контекст); 
		РаботаСФайламиКлиент.ОбъединитьВМногостраничныйФайл(Оповещение, ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПутьКФайлуЛокальный), 
			ПараметрыКонвертацииГрафическогоДокумента);
	Иначе
		СохранитьПослеОбъединенияЗавершение(Контекст);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура Настройка(Команда)
	
	ДвустороннееСканированиеЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль,
		ИмяУстройстваСканирования, "DUPLEX");
	ДоступностьДвустороннееСканирование = (ДвустороннееСканированиеЧисло <> -1);
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ПоказыватьДиалогСканера",  ПоказыватьДиалогСканера);
	ПараметрыФормы.Вставить("Разрешение",               РазрешениеПеречисление);
	ПараметрыФормы.Вставить("Цветность",                ЦветностьПеречисление);
	ПараметрыФормы.Вставить("Поворот",                  ПоворотПеречисление);
	ПараметрыФормы.Вставить("РазмерБумаги",             РазмерБумагиПеречисление);
	ПараметрыФормы.Вставить("ДвустороннееСканирование", ДвустороннееСканирование);
	
	ПараметрыФормы.Вставить(
		"ИспользоватьImageMagickДляПреобразованияВPDF", ИспользоватьImageMagickДляПреобразованияВPDF);
	
	ПараметрыФормы.Вставить("ДоступностьПоворот",       ДоступностьПоворот);
	ПараметрыФормы.Вставить("ДоступностьРазмерБумаги",  ДоступностьРазмерБумаги);
	ПараметрыФормы.Вставить("ДоступностьДвустороннееСканирование", ДоступностьДвустороннееСканирование);
	
	ПараметрыФормы.Вставить("ФорматСканированногоИзображения",     ФорматСканированногоИзображения);
	ПараметрыФормы.Вставить("КачествоJPG",                         КачествоJPG);
	ПараметрыФормы.Вставить("СжатиеTIFF",                          СжатиеTIFFПеречисление);
	ПараметрыФормы.Вставить("СохранятьВPDF",        СохранятьВPDF);
	ПараметрыФормы.Вставить("ФорматХраненияМногостраничный",       ФорматХраненияМногостраничный);
	
	ОткрытьФорму("Обработка.Сканирование.Форма.НастройкаСканированияНаСеанс", ПараметрыФормы, ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура СохранитьВсеКакОдинФайл(Команда)
	
	ПараметрыВыполнения = Новый Структура;
	ПараметрыВыполнения.Вставить("МассивФайловКопия", Новый Массив);
	ПараметрыВыполнения.Вставить("ФайлРезультата", "");
	
	Для Каждого Строка Из ТаблицаФайлов Цикл
		ПараметрыВыполнения.МассивФайловКопия.Добавить(Новый Структура("ПутьКФайлу", Строка.ПутьКФайлу));
	КонецЦикла;
	
	ТаблицаФайлов.Очистить(); // Чтобы не удалились файлы в ПриЗакрытии.
	
	// Здесь работаем со всеми картинками - объединяем их в один многостраничный файл.
	
	ПутиКФайлам = Новый Массив;
	
	Для Каждого Строка Из ПараметрыВыполнения.МассивФайловКопия Цикл
		ПутиКФайлам.Добавить(Строка.ПутьКФайлу);
	КонецЦикла;
	
	ПараметрыКонвертацииГрафическогоДокумента = РаботаСФайламиКлиент.ПараметрыКонвертацииГрафическогоДокумента();
	ПараметрыКонвертацииГрафическогоДокумента.ИмяФайлаРезультата = ПараметрыВыполнения.ФайлРезультата;
	Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииПрисоединенныйФайл() Тогда
		ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла();
	ИначеЕсли ЗначениеЗаполнено(ТипРезультата) Тогда
		ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = ТипРезультата;
	КонецЕсли;	
#Если НЕ ВебКлиент И НЕ МобильныйКлиент Тогда
	РасширениеРезультата = Строка(ФорматХраненияМногостраничный);
	РасширениеРезультата = НРег(РасширениеРезультата); 
	ПараметрыВыполнения.ФайлРезультата = ПолучитьИмяВременногоФайла(РасширениеРезультата); // АПК:441 Удаление временного файла см. ПринятьВсеКакОдинФайлЗавершение
	ПараметрыКонвертацииГрафическогоДокумента.ФорматРезультата = РасширениеРезультата;
#КонецЕсли
		
	Контекст = Новый Структура;
	Контекст.Вставить("ПараметрыВыполнения", ПараметрыВыполнения);
	Контекст.Вставить("ДвоичныеДанныеРезультата", "");
	
	Оповещение = Новый ОписаниеОповещения("СохранитьВсеКакОдинФайлЗавершение", ЭтотОбъект, Контекст); 
	
	РаботаСФайламиКлиент.ОбъединитьВМногостраничныйФайл(Оповещение, ПутиКФайлам, ПараметрыКонвертацииГрафическогоДокумента);
КонецПроцедуры

&НаКлиенте
Процедура СохранитьВсеКакОтдельныеФайлы(Команда)
	
	МассивФайловКопия = Новый Массив;
	Для Каждого Строка Из ТаблицаФайлов Цикл
		МассивФайловКопия.Добавить(Новый Структура("ПутьКФайлу", Строка.ПутьКФайлу));
	КонецЦикла;
	
	ТаблицаФайлов.Очистить(); // Чтобы не удалились файлы в ПриЗакрытии.
	
	Если СохранятьВPDF Тогда
		РасширениеРезультата = "pdf";
	Иначе
		РасширениеРезультата = Строка(ФорматСканированногоИзображения);
		РасширениеРезультата = НРег(РасширениеРезультата);
	КонецЕсли; 
	
	ПараметрыДобавления = Новый Структура;
	ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайла);
	ПараметрыДобавления.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
	ПараметрыДобавления.Вставить("ИдентификаторФормы", УникальныйИдентификатор);
	ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект);
	ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", Истина);
	ПараметрыДобавления.Вставить("ПолноеИмяФайла", "");
	ПараметрыДобавления.Вставить("ИмяСоздаваемогоФайла", "");
	ПараметрыДобавления.Вставить("ЭтоФайл", ЭтоФайл);
	
	Контекст = Новый Структура;
	Контекст.Вставить("РасширениеРезультата", РасширениеРезультата);
	Контекст.Вставить("ПараметрыДобавления", ПараметрыДобавления);
	Контекст.Вставить("ОтсканированныеФайлы", Новый Массив);
	Контекст.Вставить("ПолныйТекстВсехОшибок", "");
	Контекст.Вставить("КоличествоОшибок", 0);
	Контекст.Вставить("МассивФайлов", МассивФайловКопия);
	Контекст.Вставить("ИндексФайла", 0);
	
	СохранитьКакОтдельныеФайлыРекурсивно(Контекст);
	
КонецПроцедуры

&НаКлиенте
Процедура Сканировать(Команда)
	
	ПозицияДляВставки = Неопределено;
	ОписаниеОповещения = Новый ОписаниеОповещения("НачатьСканированиеПослеПолученияКомпоненты", ЭтотОбъект);
	РаботаСФайламиСлужебныйКлиент.ПроинициализироватьКомпоненту(ОписаниеОповещения, Истина);
		
КонецПроцедуры

&НаКлиенте
Процедура ТекстОшибкиСканированияОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	Если НавигационнаяСсылкаФорматированнойСтроки = "ТехническаяИнформация" Тогда
		ПослеПолученияТехническойИнформации = Новый ОписаниеОповещения("ПослеПолученияТехническойИнформации", ЭтотОбъект);
		РаботаСФайламиСлужебныйКлиент.ПолучитьТехническуюИнформацию(НСтр("ru='Последняя попытка сканирования завершилась неудачно.'"),
			ПослеПолученияТехническойИнформации);
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ТребуетсяПомощьНажатие(Элемент)
	
	ТекстОшибки = СтроковыеФункцииКлиент.ФорматированнаяСтрока(СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Производится сканирование с помощью устройства %1.
						|Попробуйте выполнить одно из следующих действий:
						|  • Проверьте подключение сканера и повторите попытку сканирования.
						|  • Укажите в <a href = ""%2"">настройках сканирования</a> доступный сканер.
						|  • Если проблема повторится, обратитесь в службу поддержки фирмы ""1С"", 
						|    предоставив <a href = ""%3"">техническую информацию</a> о возникшей проблеме.'"), 
					ИмяУстройстваСканирования, "ОткрытьНастройки", "ТехническаяИнформация"));
	
	РаботаСФайламиСлужебныйКлиент.ПоказатьОшибкуСканирования(ПодключаемыйМодуль, ЭтотОбъект, 
		НСтр("ru='Проблема при сканировании'"), 
		НСтр("ru='Пользователь вызвал диалог помощи во время сканирования.'"), ТекстОшибки, Истина);
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Процедура ПередОткрытием()
	
	СтандартныеПодсистемыКлиент.УстановитьХранениеФормы(ЭтотОбъект, Ложь);
	
	ПараметрыОткрытия = Новый Структура;
	ПараметрыОткрытия.Вставить("ТекущийШаг", 1);
	ПараметрыОткрытия.Вставить("ПоказыватьДиалог", Неопределено);
	ПараметрыОткрытия.Вставить("ВыбранноеУстройство", Неопределено);
	ПодготовкаКСканированию(Неопределено, ПараметрыОткрытия);
КонецПроцедуры

&НаКлиенте
Процедура ПодготовкаКСканированию(Результат, ПараметрыОткрытия) Экспорт

	Если ПараметрыОткрытия.ТекущийШаг = 2 Тогда
		ПовторноеСканирование = Неопределено;
		Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("ПовторноеСканирование", ПовторноеСканирование) 
			И ПовторноеСканирование = Истина Тогда
			ПрочитатьНастройки();
			ПараметрыОткрытия.ВыбранноеУстройство = ИмяУстройстваСканирования;
		КонецЕсли;
		ПараметрыОткрытия.ТекущийШаг = 3;
	КонецЕсли;
	
	Если ПараметрыОткрытия.ТекущийШаг = 1 Тогда
		ОписаниеОповещения = Новый ОписаниеОповещения("ПодготовкаКСканированиюПослеИнициализации", ЭтотОбъект, ПараметрыОткрытия);
		РаботаСФайламиСлужебныйКлиент.ПроинициализироватьКомпоненту(ОписаниеОповещения, Истина);
		Возврат;
	КонецЕсли;
	
	ПередОткрытиемАвтоматПродолжение(ПараметрыОткрытия);
КонецПроцедуры
		
&НаКлиенте
Процедура ПодготовкаКСканированиюПослеИнициализации(РезультатПроверкиИнициализации, ПараметрыОткрытия) Экспорт
	
	КомпонентаПроинициализирована = РезультатПроверкиИнициализации.Подключено;
	Если Не КомпонентаПроинициализирована Тогда
		Возврат;
	КонецЕсли;
	ПодключаемыйМодуль = РезультатПроверкиИнициализации.ПодключаемыйМодуль;
	РаботаСФайламиСлужебныйКлиент.ВключитьЛогированиеКомпоненты(ПодключаемыйМодуль, Истина);

	ПараметрыОткрытия.ТекущийШаг = 2;
	
	ПередОткрытиемАвтоматПродолжение(ПараметрыОткрытия);
КонецПроцедуры

&НаКлиенте
Процедура ПередОткрытиемАвтоматПродолжение(ПараметрыОткрытия)
	
	Если ПараметрыОткрытия.ТекущийШаг = 2 Тогда
		ПараметрыОткрытия.ПоказыватьДиалог = ПоказыватьДиалогСканера;
		ПараметрыОткрытия.ВыбранноеУстройство = ИмяУстройстваСканирования;
		
		Если ПараметрыОткрытия.ВыбранноеУстройство = "" Тогда
			Обработчик = Новый ОписаниеОповещения("ПодготовкаКСканированию", ЭтотОбъект, ПараметрыОткрытия);
			ПараметрыОткрытияФормы = Новый Структура("ПовторноеСканирование", Истина);
			ОткрытьФорму("Обработка.Сканирование.Форма.НастройкаСканирования", ПараметрыОткрытияФормы , ЭтотОбъект, , , , 
				Обработчик, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
			Возврат;
		КонецЕсли;
		
		ПараметрыОткрытия.ТекущийШаг = 3;
	КонецЕсли;
	
	Если ПараметрыОткрытия.ТекущийШаг = 3 Тогда
		Если ПараметрыОткрытия.ВыбранноеУстройство = "" Тогда 
			Возврат; // Не открывать форму.
		КонецЕсли;
		
		ПоворотЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль,
			ПараметрыОткрытия.ВыбранноеУстройство, "ROTATION");
		РазмерБумагиЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль,
			ПараметрыОткрытия.ВыбранноеУстройство, "SUPPORTEDSIZES");
		ДвустороннееСканированиеЧисло = РаботаСФайламиСлужебныйКлиент.НастройкаСканера(ЭтотОбъект, ПодключаемыйМодуль,
			ПараметрыОткрытия.ВыбранноеУстройство, "DUPLEX");
		
		ДоступностьПоворот = (ПоворотЧисло <> -1);
		ДоступностьРазмерБумаги = (РазмерБумагиЧисло <> -1);
		ДоступностьДвустороннееСканирование = (ДвустороннееСканированиеЧисло <> -1);
			
		Элементы.Сохранить.Доступность = Ложь;
		
		ПараметрСжатие = ?(ВРег(ФорматКартинки) = "JPG", КачествоJPG, СжатиеTIFF);
		
		Если Не Открыта() Тогда
			ПроверкиПриОткрытииВыполнены = Истина;
			Открыть();
			ПроверкиПриОткрытииВыполнены = Ложь;
		КонецЕсли;
			
		ОписаниеОповещения = Новый ОписаниеОповещения("НачатьСканированиеПослеПолученияКомпоненты", ЭтотОбъект);
		РаботаСФайламиСлужебныйКлиент.ПроинициализироватьКомпоненту(ОписаниеОповещения, Истина);
		
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПринятьЗавершение(Результат, ПараметрыВыполнения) Экспорт
	
	УдалитьВременныеФайлы(ПараметрыВыполнения.МассивФайловКопия);
	Если НЕ ПустаяСтрока(ПараметрыВыполнения.ФайлРезультата) Тогда
		УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
	КонецЕсли;
	
	Закрыть(Результат);
	
КонецПроцедуры

&НаКлиенте
Процедура ПринятьВсеКакОдинФайлЗавершение(Результат, ПараметрыВыполнения) Экспорт
	
	УдалитьВременныеФайлы(ПараметрыВыполнения.МассивФайловКопия);
	Если ЗначениеЗаполнено(ПараметрыВыполнения.ФайлРезультата) Тогда
		УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
	КонецЕсли;
	
	Закрыть(Результат);
	
КонецПроцедуры

&НаСервере
Процедура ПреобразоватьПеречисленияВПараметрыИПолучитьПредставление()
	
	Представление = "";
		// Информационная надпись вида:
		// "Формат хранения: PDF. Формат сканирования: JPG. Качество: 75. Формат хранения многостраничный: PDF. Разрешение:
		// 200. Цветное";
	
	Если Не ПоказыватьДиалогСканера Тогда
	
		НастройкиСканирования = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыСканирования();
		НастройкиСканирования.Разрешение 	= РазрешениеПеречисление;
		НастройкиСканирования.Цветность		= ЦветностьПеречисление;
		НастройкиСканирования.Поворот		= ПоворотПеречисление;
		НастройкиСканирования.РазмерБумаги	= РазмерБумагиПеречисление;
		НастройкиСканирования.СжатиеTIFF	= СжатиеTIFFПеречисление;
		ПримитивныеНастройкиСканирования = РаботаСФайламиСлужебный.КонвертироватьНастройкиСканирования(НастройкиСканирования);
		ЗаполнитьЗначенияСвойств(ЭтотОбъект, ПримитивныеНастройкиСканирования, 
			"Разрешение, Цветность, Поворот, РазмерБумаги, СжатиеTIFF");
		
		Если СохранятьВPDF Тогда
			ФорматКартинки = Строка(ФорматСканированногоИзображения);
			
			Представление = Представление + НСтр("ru = 'Сохранить как:'") + " ";
			Представление = Представление + "PDF";
			Представление = Представление + ". ";
			Представление = Представление + НСтр("ru = 'Формат сканирования:'") + " ";
			Представление = Представление + ФорматКартинки;
			Представление = Представление + ". ";
		Иначе	
			ФорматКартинки = Строка(ФорматСканированногоИзображения);
			Представление = Представление + НСтр("ru = 'Сохранить как:'") + " ";
			Представление = Представление + ФорматКартинки;
			Представление = Представление + ". ";
		КонецЕсли;
		

		Если ВРег(ФорматКартинки) = "JPG" Тогда
			Представление = Представление +  НСтр("ru = 'Качество:'") + " " + Строка(КачествоJPG) + ". ";
		КонецЕсли;	
		
		Если ВРег(ФорматКартинки) = "TIF" Тогда
			Представление = Представление +  НСтр("ru = 'Сжатие:'") + " " + Строка(СжатиеTIFFПеречисление) + ". ";
		КонецЕсли;
		
		Представление = Представление + НСтр("ru = 'Сохранить как многостраничный:'") + " ";
		Представление = Представление + Строка(ФорматХраненияМногостраничный);
		Представление = Представление + ". ";
		
		Если Разрешение <> -1 Тогда
			Представление = Представление + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Разрешение: %1 dpi. %2.'") + " ",
				Строка(Разрешение), Строка(ЦветностьПеречисление));
		Иначе
			Представление = Представление + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Разрешение: Не задано. Цветность: %2.'") + " ",
				Строка(ЦветностьПеречисление));
		КонецЕсли;
		
		Если НЕ ПоворотПеречисление.Пустая() Тогда
			Представление = Представление +  НСтр("ru = 'Поворот:'")+ " " + Строка(ПоворотПеречисление) + ". ";
		КонецЕсли;	
		
		Если НЕ РазмерБумагиПеречисление.Пустая() Тогда
			Представление = Представление +  НСтр("ru = 'Размер бумаги:'") + " " + Строка(РазмерБумагиПеречисление) + ". ";
		КонецЕсли;	
		
		Если ДвустороннееСканирование = Истина Тогда
			Представление = Представление +  НСтр("ru = 'Двустороннее сканирование'") + ". ";
		КонецЕсли;	
		
	Иначе
		Если СохранятьВPDF Тогда
			ФорматКартинки = Строка(ФорматСканированногоИзображения);
			
			Представление = Представление + НСтр("ru = 'Сохранить как:'") + " ";
			Представление = Представление + "PDF";
			Представление = Представление + ". ";
		КонецЕсли;
		
		Представление = Представление + НСтр("ru = 'Сохранить как многостраничный:'") + " ";
		Представление = Представление + Строка(ФорматХраненияМногостраничный);
		Представление = Представление + ". ";
		
		Представление = Представление + НСтр("ru = 'Настройки сканирования были установлены в диалоге сканера.'");
		
	КонецЕсли;
	
	ТекстНастроек = Представление;
		
	Элементы.ТекстНастроекИзменить.Заголовок = ТекстНастроек + "Изменить";
	
КонецПроцедуры

&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
	
#Если НЕ ВебКлиент И НЕ МобильныйКлиент Тогда
	Если Источник = "TWAIN" Тогда
		РаботаСФайламиСлужебныйКлиент.ЗаписатьЖурналСканирования("СобытиеСканера", 
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Событие %1, данные %2'"), Событие, Данные));
	КонецЕсли;
	
	Если Источник = "TWAIN" И Событие = "ImageAcquired" Тогда
		
		ИмяФайлаКартинки = Данные;
		Элементы.Сохранить.Доступность = Истина;
		КоличествоСтрокДоДобавления = ТаблицаФайлов.Количество();
		СтрокаТаблицы = Неопределено;
		
		Если ПозицияДляВставки = Неопределено Тогда
			СтрокаТаблицы = ТаблицаФайлов.Добавить();
		Иначе
			СтрокаТаблицы = ТаблицаФайлов.Вставить(ПозицияДляВставки);
			ПозицияДляВставки = ПозицияДляВставки + 1;
		КонецЕсли;
		
		СтрокаТаблицы.ПутьКФайлу = ИмяФайлаКартинки;
		
		Если НарастающийНомерИзображения = Неопределено Тогда
			НарастающийНомерИзображения = 1;
		КонецЕсли;
			
		СтрокаТаблицы.Представление = НСтр("ru='Изображение'") + Строка(НарастающийНомерИзображения);
		НарастающийНомерИзображения = НарастающийНомерИзображения + 1;
		
		Если КоличествоСтрокДоДобавления = 0 Тогда
			ПутьКВыбранномуФайлу = СтрокаТаблицы.ПутьКФайлу;
			ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКВыбранномуФайлу);
			АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
			СтрокаТаблицы.АдресКартинки = АдресКартинки;
		КонецЕсли;
		
		Если ТолькоОдинФайл Тогда
			Элементы.ФормаСканироватьЕще.Видимость = (ТаблицаФайлов.Количество() = 0);
		ИначеЕсли ТаблицаФайлов.Количество() > 1 И Элементы.ТаблицаФайлов.Видимость = Ложь Тогда
			Элементы.ТаблицаФайлов.Видимость = Истина;
			Элементы.ФормаПринятьВсеКакОдинФайл.Видимость = Истина;
			Элементы.ФормаПринятьВсеКакОдинФайл.КнопкаПоУмолчанию = Истина;
			Элементы.ФормаПринятьВсеКакОтдельныеФайлы.Видимость = Истина;
			Элементы.Сохранить.Видимость = Ложь;
		КонецЕсли;
		
		Если ТаблицаФайлов.Количество() > 1 Тогда
			Элементы.ТаблицаФайловКонтекстноеМенюУдалить.Доступность = Истина;
		КонецЕсли;
		
	ИначеЕсли Источник = "TWAIN" И Событие = "EndBatch" Тогда
		
		Если ТаблицаФайлов.Количество() <> 0 Тогда
			ИдентификаторСтроки = ТаблицаФайлов[ТаблицаФайлов.Количество() - 1].ПолучитьИдентификатор();
			Элементы.ТаблицаФайлов.ТекущаяСтрока = ИдентификаторСтроки;
		КонецЕсли;
		РаботаСФайламиСлужебныйКлиент.УдалитьОшибкуСканирования(ПодключаемыйМодуль);
	ИначеЕсли Источник = "TWAIN" И Событие = "UserPressedCancel" Тогда
		Если Открыта() Тогда
			ТекущаяДата = ТекущаяДата(); // АПК:143 ТекущаяДата для расчета интервала времени
			Если ТекущаяДата < НачалоСканирования + 3 Тогда
				ПредставлениеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru='Сканирование отменено (событие %1) через %2 сек. См. %3'"), Событие, 
					ТекущаяДата - НачалоСканирования, "ImageScan.log");
				РаботаСФайламиСлужебныйКлиент.ЗаписатьЖурналСканирования("СобытиеСканера" + "." + Событие, 
					ПредставлениеОшибки, Истина);
				РаботаСФайламиСлужебныйКлиент.ПоказатьОшибкуСканирования(ПодключаемыйМодуль, ЭтотОбъект, 
					НСтр("ru='Не удалось отсканировать документ'"), ПредставлениеОшибки);
			Иначе
				РаботаСФайламиСлужебныйКлиент.УдалитьОшибкуСканирования(ПодключаемыйМодуль);
				Закрыть();
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Элементы.ОшибкаСканирования.Видимость = РаботаСФайламиСлужебныйКлиент.БылаОшибкаСканирования();
	
#КонецЕсли

КонецПроцедуры

&НаКлиенте
Процедура УдалитьВременныеФайлы(ТаблицаЗначенийФайлов)
	
	Для Каждого Строка Из ТаблицаЗначенийФайлов Цикл
		УдалитьФайлы(Строка.ПутьКФайлу);
	КонецЦикла;
	
	ТаблицаЗначенийФайлов.Очистить();
	ПозицияДляВставки = Неопределено;
	
КонецПроцедуры

&НаКлиенте
Функция ТекстСообщенияОшибкиПреобразованияВPDF(ФайлРезультата)
	
	ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'Не найден файл ""%1"".
		           |Проверьте, что установлена программа ImageMagick и
		           |указан правильный путь к программе преобразования в
		           |PDF в форме настроек сканирования.'"),
		ФайлРезультата);
		
	Возврат ТекстСообщения;
	
КонецФункции

&НаСервере
Процедура ПрочитатьНастройки()
	НастройкиСканированияПользователя = РаботаСФайлами.ПолучитьНастройкиСканированияПользователя(ИдентификаторКлиента);
	ЗаполнитьЗначенияСвойств(ЭтотОбъект, НастройкиСканированияПользователя);
	РазрешениеПеречисление = НастройкиСканированияПользователя.Разрешение;
	ЦветностьПеречисление = НастройкиСканированияПользователя.Цветность;
	ПоворотПеречисление  = НастройкиСканированияПользователя.Поворот;
	СжатиеTIFFПеречисление = НастройкиСканированияПользователя.СжатиеTIFF;
	ИмяУстройстваСканирования = НастройкиСканированияПользователя.ИмяУстройства;	
	РазмерБумагиПеречисление = НастройкиСканированияПользователя.РазмерБумаги; 
КонецПроцедуры

&НаКлиенте
Процедура СохранитьПослеОбъединенияЗавершение(Контекст)
	ПараметрыВыполнения = Контекст.ПараметрыВыполнения;
	ПутьКФайлуЛокальный = Контекст.ПутьКФайлуЛокальный;
	
	Результат = РаботаСФайламиСлужебныйКлиент.РезультатСканирования();
		
	Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииДвоичныеДанные() Тогда
		Результат.ДвоичныеДанные = ?(ЗначениеЗаполнено(Контекст.ДвоичныеДанныеРезультата), 
			Контекст.ДвоичныеДанныеРезультата, Новый ДвоичныеДанные(Контекст.ПутьКФайлуЛокальный));
		ПринятьЗавершение(Результат, ПараметрыВыполнения);
		Возврат;
	ИначеЕсли ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла() Тогда
		Результат.ИмяФайла = Контекст.ПутьКФайлуЛокальный;
		Для ИндексФайла = -ПараметрыВыполнения.МассивФайловКопия.ВГраница() По 0 Цикл
			Если ПараметрыВыполнения.МассивФайловКопия[-ИндексФайла].ПутьКФайлу <> Контекст.ПутьКФайлуЛокальный Тогда
				ПараметрыВыполнения.МассивФайловКопия.Удалить(-ИндексФайла);
			КонецЕсли;
		КонецЦикла;	
		
		ПараметрыВыполнения.ФайлРезультата = "";
		ПринятьЗавершение(Результат, ПараметрыВыполнения);
		Возврат;
	Иначе
		Если НЕ ПустаяСтрока(ПутьКФайлуЛокальный) Тогда
			Обработчик = Новый ОписаниеОповещения("ПринятьЗавершение", ЭтотОбъект, ПараметрыВыполнения);
			
			ПараметрыДобавления = Новый Структура;
			ПараметрыДобавления.Вставить("ОбработчикРезультата", Обработчик);
			ПараметрыДобавления.Вставить("ПолноеИмяФайла", ПутьКФайлуЛокальный);
			ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайла);
			ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект);
			ПараметрыДобавления.Вставить("ИмяСоздаваемогоФайла", ИмяФайла);
			ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", НеОткрыватьКарточкуПослеСозданияИзФайла);
			ПараметрыДобавления.Вставить("ИдентификаторФормы", УникальныйИдентификатор);
			ПараметрыДобавления.Вставить("ЭтоФайл", ЭтоФайл);
			
			РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширением(ПараметрыДобавления);
			Возврат;
		КонецЕсли;
	КонецЕсли;
	
	
	Результат.ТекстОшибки = НСтр("ru = 'Не удалось сохранить отсканированный файл.'");
	
	ПринятьЗавершение(Результат, ПараметрыВыполнения);
КонецПроцедуры

&НаКлиенте
Процедура СохранитьПослеОбъединения(РезультатОбъединения, Контекст) Экспорт
	
	Контекст.ДвоичныеДанныеРезультата = РезультатОбъединения.ДвоичныеДанные;
	ПараметрыВыполнения = Контекст.ПараметрыВыполнения;
	
	Результат = РаботаСФайламиСлужебныйКлиент.РезультатСканирования();
	
	Если РезультатОбъединения.Успешно = Ложь Тогда
		ТекстСообщения = РезультатОбъединения.ОписаниеОшибки;
		ПоказатьПредупреждение(, ТекстСообщения);
		УдалитьФайлы(Контекст.ПутьКФайлуЛокальный);
		УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
		Результат.ТекстОшибки = ТекстСообщения;
		ПринятьЗавершение(Результат, ПараметрыВыполнения);
		Возврат;
	КонецЕсли;
		
	Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииДвоичныеДанные() Тогда
		Результат.ДвоичныеДанные = Контекст.ДвоичныеДанныеРезультата;
	ИначеЕсли ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла() Тогда
		Результат.ИмяФайла = РезультатОбъединения.ИмяФайлаРезультата;
	Иначе
		ОбъектФайлРезультата = Новый Файл(ПараметрыВыполнения.ФайлРезультата);
		Если НЕ ОбъектФайлРезультата.Существует() Тогда
			ТекстСообщения = ТекстСообщенияОшибкиПреобразованияВPDF(ПараметрыВыполнения.ФайлРезультата);
			ПоказатьПредупреждение(, ТекстСообщения);
			УдалитьФайлы(Контекст.ПутьКФайлуЛокальный);
			УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
			Результат.ТекстОшибки = ТекстСообщения;
			ПринятьЗавершение(Результат, ПараметрыВыполнения);
			Возврат;
		КонецЕсли;
		
		УдалитьФайлы(Контекст.ПутьКФайлуЛокальный);
		Контекст.ПутьКФайлуЛокальный = ПараметрыВыполнения.ФайлРезультата;
	КонецЕсли;
	
	СохранитьПослеОбъединенияЗавершение(Контекст);
КонецПроцедуры

&НаКлиенте
Процедура СохранитьВсеКакОдинФайлЗавершение(РезультатОбъединения, Контекст) Экспорт
	
	Результат = РаботаСФайламиСлужебныйКлиент.РезультатСканирования();
	
	ПараметрыВыполнения = Контекст.ПараметрыВыполнения;
	ПараметрыВыполнения.ФайлРезультата = РезультатОбъединения.ИмяФайлаРезультата;
	Контекст.ДвоичныеДанныеРезультата = РезультатОбъединения.ДвоичныеДанные;
	
	Если РезультатОбъединения.Успешно = Ложь Тогда
		ТекстСообщения = РезультатОбъединения.ОписаниеОшибки;
		Если ЗначениеЗаполнено(ПараметрыВыполнения.ФайлРезультата) Тогда
			УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
		КонецЕсли;
		ПараметрыВыполнения.ФайлРезультата = "";
		Результат.ТекстОшибки = ТекстСообщения;
		ПоказатьПредупреждение(, ТекстСообщения);
		ПринятьВсеКакОдинФайлЗавершение(Результат, ПараметрыВыполнения);
		Возврат;
	КонецЕсли;
		
	Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииДвоичныеДанные() Тогда
		Результат.ДвоичныеДанные = Контекст.ДвоичныеДанныеРезультата;
	ИначеЕсли ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла() Тогда
		Результат.ИмяФайла = ПараметрыВыполнения.ФайлРезультата;
	Иначе
		ОбъектФайлРезультата = Новый Файл(ПараметрыВыполнения.ФайлРезультата);
		Если НЕ ОбъектФайлРезультата.Существует() Тогда
			ТекстСообщения = ТекстСообщенияОшибкиПреобразованияВPDF(ПараметрыВыполнения.ФайлРезультата);
			УдалитьФайлы(ПараметрыВыполнения.ФайлРезультата);
			ПараметрыВыполнения.ФайлРезультата = "";
			Результат.ТекстОшибки = ТекстСообщения;
			ПоказатьПредупреждение(, ТекстСообщения);
			ПринятьВсеКакОдинФайлЗавершение(Результат, ПараметрыВыполнения);
			Возврат;
		КонецЕсли;
		
		Если НЕ ПустаяСтрока(ПараметрыВыполнения.ФайлРезультата) Тогда
			
			Обработчик = Новый ОписаниеОповещения("ПринятьВсеКакОдинФайлЗавершение", ЭтотОбъект, ПараметрыВыполнения);
			
			ПараметрыДобавления = Новый Структура;
			ПараметрыДобавления.Вставить("ОбработчикРезультата", Обработчик);
			ПараметрыДобавления.Вставить("ВладелецФайла", ВладелецФайла);
			ПараметрыДобавления.Вставить("ФормаВладелец", ЭтотОбъект);
			ПараметрыДобавления.Вставить("ПолноеИмяФайла", ПараметрыВыполнения.ФайлРезультата);
			ПараметрыДобавления.Вставить("ИмяСоздаваемогоФайла", ИмяФайла);
			ПараметрыДобавления.Вставить("НеОткрыватьКарточкуПослеСозданияИзФайла", НеОткрыватьКарточкуПослеСозданияИзФайла);
			ПараметрыДобавления.Вставить("ИдентификаторФормы", УникальныйИдентификатор);
			ПараметрыДобавления.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
			ПараметрыДобавления.Вставить("ЭтоФайл", ЭтоФайл);
			
			РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширением(ПараметрыДобавления);
			Возврат;
		КонецЕсли;
		
	КонецЕсли;
	ПараметрыВыполнения.ФайлРезультата = "";
	ПринятьВсеКакОдинФайлЗавершение(Результат, ПараметрыВыполнения);
	
КонецПроцедуры

&НаКлиенте
Процедура СохранитьКакОтдельныеФайлыРекурсивно(Контекст)
	
	РасширениеРезультата = Контекст.РасширениеРезультата;
	ПараметрыДобавления = Контекст.ПараметрыДобавления;
	ОтсканированныеФайлы = Контекст.ОтсканированныеФайлы;
	
	// Здесь работаем со всеми картинками -каждую как отдельный файл принимаем.
	Если Контекст.ИндексФайла <= Контекст.МассивФайлов.ВГраница() Тогда
		Строка = Контекст.МассивФайлов[Контекст.ИндексФайла];
		
		ПутьКФайлуЛокальный = Строка.ПутьКФайлу;
		Контекст.Вставить("ПутьКФайлуЛокальный", ПутьКФайлуЛокальный);
		Контекст.Вставить("ФайлРезультата", "");
		Контекст.Вставить("ДвоичныеДанныеРезультата", "");
		Если РасширениеРезультата = "pdf" Тогда
			
#Если НЕ ВебКлиент И НЕ МобильныйКлиент Тогда
		// АПК:441-выкл Временный файл не удаляется, если от функции РаботаСФайламиКлиент.ДобавитьСоСканера
		// требуется вернуть путь к файлу.
		Контекст.ФайлРезультата = ПолучитьИмяВременногоФайла("pdf");
		// АПК:441-вкл
#КонецЕсли
			ПараметрыКонвертацииГрафическогоДокумента = РаботаСФайламиКлиент.ПараметрыКонвертацииГрафическогоДокумента();
			ПараметрыКонвертацииГрафическогоДокумента.ИмяФайлаРезультата = Контекст.ФайлРезультата;
			Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииПрисоединенныйФайл() Тогда
				ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла();
			ИначеЕсли ЗначениеЗаполнено(ТипРезультата) Тогда
				ПараметрыКонвертацииГрафическогоДокумента.ТипРезультата = ТипРезультата;
			КонецЕсли;
			
			Оповещение = Новый ОписаниеОповещения("СохранитьКакОтдельныеФайлыРекурсивноПослеОбъединения", ЭтотОбъект, Контекст); 
			РаботаСФайламиКлиент.ОбъединитьВМногостраничныйФайл(Оповещение, ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ПутьКФайлуЛокальный), 
			ПараметрыКонвертацииГрафическогоДокумента);
		Иначе
			Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииДвоичныеДанные() Тогда
				Контекст.ДвоичныеДанныеРезультата = Новый ДвоичныеДанные(Контекст.ПутьКФайлуЛокальный);
			КонецЕсли;

			Оповещение = Новый ОписаниеОповещения("СохранитьКакОтдельныеФайлыРекурсивноЗавершение", ЭтотОбъект, Контекст);
			ВыполнитьОбработкуОповещения(Оповещение);
		КонецЕсли;
						
	Иначе
		Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииПрисоединенныйФайл() Тогда
			РаботаСФайламиСлужебныйВызовСервера.ЗанестиМаксимальныйНомерДляСканирования(
				ВладелецФайла, НомерФайла - 1);
		КонецЕсли;
		
		УдалитьВременныеФайлы(Контекст.МассивФайлов);
		
		Если Контекст.КоличествоОшибок > 0 Тогда
			Если Контекст.КоличествоОшибок = 1 Тогда
				ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Не удалось сохранить файл по причине:
						|%1'"),
					Контекст.ПолныйТекстВсехОшибок);
			Иначе
				ТекстПредупреждения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'Не удалось сохранить некоторые файлы (%1):
						|%2'"),
					Строка(Контекст.КоличествоОшибок), Контекст.ПолныйТекстВсехОшибок);
			КонецЕсли;
			СтандартныеПодсистемыКлиент.ПоказатьВопросПользователю(Неопределено, ТекстПредупреждения, РежимДиалогаВопрос.ОК);
		КонецЕсли;
		
		Закрыть(ОтсканированныеФайлы);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура СохранитьКакОтдельныеФайлыРекурсивноЗавершение(РезультатОповещения, Контекст) Экспорт
	
	Результат = РаботаСФайламиСлужебныйКлиент.РезультатСканирования();
	Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииДвоичныеДанные() Тогда
		Результат.ДвоичныеДанные = Контекст.ДвоичныеДанныеРезультата;
		Контекст.ОтсканированныеФайлы.Добавить(Результат);
	ИначеЕсли ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииИмяФайла() Тогда
		Результат.ИмяФайла = Контекст.ФайлРезультата;
		Контекст.ОтсканированныеФайлы.Добавить(Результат);
	Иначе
		Если НЕ ПустаяСтрока(Контекст.ПутьКФайлуЛокальный) Тогда
			Контекст.ПараметрыДобавления.ПолноеИмяФайла = Контекст.ПутьКФайлуЛокальный;
			Контекст.ПараметрыДобавления.ИмяСоздаваемогоФайла = ИмяФайла;
			Результат = РаботаСФайламиСлужебныйКлиент.ДобавитьИзФайловойСистемыСРасширениемСинхронно(Контекст.ПараметрыДобавления);
			Если Не Результат.ФайлДобавлен Тогда
				Если ЗначениеЗаполнено(Результат.ТекстОшибки) Тогда
					ПоказатьПредупреждение(, Результат.ТекстОшибки);
					Возврат;
				КонецЕсли;
			Иначе
				Контекст.ОтсканированныеФайлы.Добавить(Результат);
			КонецЕсли;
		КонецЕсли;
		
		Если НЕ ПустаяСтрока(Контекст.ФайлРезультата) Тогда
			УдалитьФайлы(Контекст.ФайлРезультата);
		КонецЕсли;
	КонецЕсли;
	
	НомерФайла = НомерФайла + 1;
	ИмяФайла = РаботаСФайламиСлужебныйКлиентСервер.ИмяСканированногоФайла(НомерФайла, "");
	Контекст.ИндексФайла = Контекст.ИндексФайла + 1;
	СохранитьКакОтдельныеФайлыРекурсивно(Контекст);
КонецПроцедуры

&НаКлиенте
Процедура СохранитьКакОтдельныеФайлыРекурсивноПослеОбъединения(РезультатОбъединения, Контекст) Экспорт
	Контекст.ФайлРезультата = РезультатОбъединения.ИмяФайлаРезультата;
	Контекст.ДвоичныеДанныеРезультата = РезультатОбъединения.ДвоичныеДанные;
	
	Если РезультатОбъединения.Успешно = Ложь Тогда
		ТекстОшибки = РезультатОбъединения.ОписаниеОшибки;
		Если Контекст.ПолныйТекстВсехОшибок <> "" Тогда
			Контекст.ПолныйТекстВсехОшибок = Контекст.ПолныйТекстВсехОшибок + Символы.ПС + Символы.ПС + "---" + Символы.ПС + Символы.ПС;
		КонецЕсли;
		Контекст.ПолныйТекстВсехОшибок = Контекст.ПолныйТекстВсехОшибок + ТекстОшибки;
		Контекст.КоличествоОшибок = Контекст.КоличествоОшибок + 1;
		Контекст.ФайлРезультата = "";
	КонецЕсли;
	
	Если ТипРезультата = РаботаСФайламиКлиент.ТипРезультатаКонвертацииПрисоединенныйФайл() Тогда
		ОбъектФайлРезультата = Новый Файл(Контекст.ФайлРезультата);
		Если НЕ ОбъектФайлРезультата.Существует() Тогда
			ТекстОшибки = ТекстСообщенияОшибкиПреобразованияВPDF(Контекст.ФайлРезультата);
			Если Контекст.ПолныйТекстВсехОшибок <> "" Тогда
				Контекст.ПолныйТекстВсехОшибок = Контекст.ПолныйТекстВсехОшибок + Символы.ПС + Символы.ПС + "---" + Символы.ПС + Символы.ПС;
			КонецЕсли;
			Контекст.ПолныйТекстВсехОшибок = Контекст.ПолныйТекстВсехОшибок + ТекстОшибки;
			Контекст.КоличествоОшибок = Контекст.КоличествоОшибок + 1;
			Контекст.ФайлРезультата = "";
		КонецЕсли;
		
		Контекст.ПутьКФайлуЛокальный = Контекст.ФайлРезультата;
	КонецЕсли;
	
	Оповещение = Новый ОписаниеОповещения("СохранитьКакОтдельныеФайлыРекурсивноЗавершение", ЭтотОбъект, Контекст);
	ВыполнитьОбработкуОповещения(Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура НачатьСканированиеПослеПолученияКомпоненты(РезультатИнициализации, Контекст) Экспорт
	Если РезультатИнициализации.Подключено Тогда
		
		ПодключаемыйМодуль = РезультатИнициализации.ПодключаемыйМодуль;
		ПараметрыСканирования = РаботаСФайламиСлужебныйКлиентСервер.ПараметрыСканирования();
		ПараметрыСканирования.ПоказыватьДиалог = ПоказыватьДиалогСканера;
		ПараметрыСканирования.ВыбранноеУстройство = ИмяУстройстваСканирования;
		ПараметрыСканирования.ФорматКартинки = ФорматКартинки;
		ПараметрыСканирования.Разрешение = Разрешение;
		ПараметрыСканирования.Цветность = Цветность;
		ПараметрыСканирования.Поворот = Поворот;
		ПараметрыСканирования.РазмерБумаги = РазмерБумаги;
		ПараметрыСканирования.КачествоJPG = КачествоJPG;
		ПараметрыСканирования.СжатиеTIFF = СжатиеTIFF;
		ПараметрыСканирования.ДвустороннееСканирование = ДвустороннееСканирование;
		НачалоСканирования = ТекущаяДата();// АПК:143 Используется для расчета интервала времени
		ПараметрыЗаданияСканирования = Новый Структура();
		ПараметрыЗаданияСканирования.Вставить("НачалоСканирования", НачалоСканирования);
		ПараметрыЗаданияСканирования.Вставить("ПараметрыСканирования", ПараметрыСканирования);
		
		АдресКартинки = ПоместитьВоВременноеХранилище(БиблиотекаКартинок.ДлительнаяОперация48.ПолучитьДвоичныеДанные(), УникальныйИдентификатор);
		ОбщегоНазначенияВызовСервера.ХранилищеОбщихНастроекСохранить("КомпонентаСканирования", "ПараметрыЗаданияСканирования", 
			ПараметрыЗаданияСканирования,,,Истина);
		РаботаСФайламиСлужебныйКлиент.НачатьСканирование(ЭтотОбъект, ПодключаемыйМодуль, ПараметрыСканирования);
		
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияФормыОшибки(РезультатЗакрытия, Контекст) Экспорт
	Если РезультатЗакрытия = "ПовторитьСканирование" Тогда
		ПрочитатьНастройки();
		Пересканировать(Неопределено);
	ИначеЕсли РезультатЗакрытия = КодВозвратаДиалога.Отмена И Не Контекст.РежимТребуетсяПомощь Тогда
		Если Открыта() Тогда
			Закрыть();
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеПолученияТехническойИнформации(Результат, Контекст) Экспорт
	Элементы.ОшибкаСканирования.Видимость = Ложь;
КонецПроцедуры

#КонецОбласти
